package com.spider.sina.core;

import com.spider.common.contents.SinaRegex;
import com.spider.common.entity.sina.SinaBlog;
import us.codecraft.webmagic.Page;
import us.codecraft.webmagic.Site;
import us.codecraft.webmagic.Spider;
import us.codecraft.webmagic.processor.PageProcessor;
import us.codecraft.webmagic.selector.Selectable;

/**
 * 〈一句话功能简述〉
 * 新浪博客爬虫
 *
 * @author bf
 * @create 2018/3/29
 * @see [相关类/方法]（可选）
 * @since [产品/模块版本] （可选）
 */
public class SinaProcessor implements PageProcessor{




    /**
     * restryTimes: 重试间隔
     * sleepTime: 处理页面之间的重试间隔，单位 ms
     */
    private Site site = Site.me().setDomain("blog.sina.com.cn").setRetryTimes(3).setSleepTime(1000);

    /**
     * 定义爬虫核心，获取数据
     * @param page
     */
    @Override
    public void process(Page page) {
        Selectable url = page.getUrl();
        // 新浪首页 寻找 导航页和博客页
        if(url.regex(SinaRegex.URL_INDEX).match()){
            page.addTargetRequests(page.getHtml().links().regex(SinaRegex.IM_REGEX).all());
            page.addTargetRequests(page.getHtml().links().regex(SinaRegex.BLOG_REGEX).all());
        }
        // 导航页继续匹配导航页里面的博客
        else if(url.regex(SinaRegex.IM_REGEX).match()){
            page.addTargetRequests(page.getHtml().links().regex(SinaRegex.BLOG_REGEX).all());
        }
        //博客链接 ----找---> 博客列表
        else if(url.regex(SinaRegex.BLOG_REGEX).match()){
            page.addTargetRequests(page.getHtml().links().regex(SinaRegex.ARTLICLELIST_REGEX).all());
        }
        //列表页
        else if(url.regex(SinaRegex.ARTLICLELIST_REGEX).match()){
            page.addTargetRequests(page.getHtml().links().regex(SinaRegex.BLOG_REGEX).all());
        }
        //文章页 ---> 从文章里面寻找所要匹配的数据,具体 XPATH 规则自行百度
        else if(url.regex(SinaRegex.BLOG_REGEX).match()){

            // 文章标题
            String title = page.getHtml().xpath("//div[@class='articalTitle']/span[1]/h2/text()").toString();
            // 文章作者
            String author = page.getHtml().xpath("//*[@id='ownernick']/text()").toString();
            // 文章日期 ,并对 (2018-03-21 20:52:14) 进行格式化
            String date = page.getHtml().xpath("//div[@class='articalTitle']//span[@class='time SG_txtc']").regex("\\((.*)\\)").toString();
            // 文章标签
            String tag = page.getHtml().xpath("//td[@class='blog_tag']/allText()").toString();
            // 文章内容
            String content = page.getHtml().xpath("//div[@id='articlebody']//div[@class='articalContent']/tidyText()").toString();
            SinaBlog sinaBlog = new SinaBlog(title, author, date, tag, content);
            page.putField("sinaBlog", sinaBlog);
            sinaBlog = null;
        }

    }

    @Override
    public Site getSite() {
        return site;
    }

    /**
     * thread: 开启多少个线程
     * @param args
     */
    public static void main(String[] args){
        Spider.create(new SinaProcessor()).addUrl("http://blog.sina.com.cn/").thread(20).run();
    }
}
